/*
 * tiposPlanificador.h
 *
 *  Created on: 11/11/2011
 *      Author: utn_so
 */

#ifndef TIPOSPLANIFICADOR_H_
#define TIPOSPLANIFICADOR_H_
#include "cola.h"
#include <semaphore.h>
#include <pthread.h>
#include <stdint.h>

/*enum operaciones {
	LECTURA = 1, ESCRITURA = 2
};*/
enum modos {
	CONNECT = 1, LISTEN = 2
};
enum algoritmos {
	FSCAN = 1, SCAN = 2
};enum orientacionesCabeza {
	SUBIENDO = 1, BAJANDO = 2
};

struct config {
	int modo; //enum modo
	int raidIp;
	int raidPuerto;
	int algoPlanif; //enum algoritmos
	char *consolaPuertoEscucha; //para que?
	int logsActivado; //1 = si      0 = no
	int discoIdentificador;
	int c;// IMPORTANTE, si fuesen por ejemplo 500 cilindros aca iria 499!!
	int h;
	int s;
	int tiempoLectura; // en ms
	int tiempoEscritura; //en ms
	int rpm; //revoluciones por minuto;
	int tiempoSaltoPistas; //en ms
	char *rutaArchivoDisco;

};
struct datosPlanif{
	cola_NODO *pedidos;
	cola_NODO *pedidosProximos;//la segunda cola de FSCAN
	sem_t *pedidosDisponibles;
	sem_t *mutexFscanColas;
	pthread_mutex_t *mutexPedidosProximos;
	pthread_mutex_t *mutexPedidos;
	unsigned int pistaActual;
	struct config configuracion;
	char* regionDeMemoria;
	int orientacionCabeza;
};
void productorPedidos(void *arg);
void consumidorPedidos(void *arg);
PEDIDO *producirPedido(struct datosPlanif *datosPlanificacion);
void consumirPedido(PEDIDO *pedido,struct datosPlanif *datosPlanificacion);
PEDIDO *proximoPedidoFSCAN(struct datosPlanif *datosPlanificacion);
PEDIDO *proximoPedidoSCAN(struct datosPlanif *datosPlanificacion);
PEDIDO *desSerializarPedido(uint8_t* stream);
uint8_t *serializarContenedor(char* pedido);
void devolverStream(uint8_t* stream, struct datosPlanif *datosPlanificacion);
uint8_t* obtenerStream(struct datosPlanif *datosPlanificacion);

#endif /* TIPOSPLANIFICADOR_H_ */
